널 포인터
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
널 포인터는 프로그래밍에서 특정 메모리 주소를 가리키지 않는 포인터를 의미하며, 토니 호어가 1965년 ALGOL W 언어에서 처음 발명했다. C 언어에서는 `NULL` 매크로, C++에서는 `nullptr`를 통해 널 포인터를 표현하며, 널 포인터 역참조는 정의되지 않은 동작으로 프로그램 충돌을 유발할 수 있다. 다양한 프로그래밍 언어에서 널 포인터에 해당하는 키워드(예: 자바의 `null`, 파이썬의 `None`)가 존재하며, 널 포인터 역참조를 방지하기 위해 널이 없는 언어 사용, 정적 분석, 런타임 디버깅 도구 등의 기술이 활용된다.
더 읽어볼만한 페이지
널 포인터 | |
---|---|
일반 정보 | |
이름 | 널 포인터 |
영어 | Null Pointer |
일본어 | ヌルポインタ |
개요 | |
정의 | 유효하지 않은 메모리 주소를 가리키는 포인터 |
값 | 일반적으로 0 또는 NULL로 정의됨 |
발생 시점 | 초기화되지 않은 포인터 변수 사용 시 동적 할당 실패 시 객체가 소멸된 후 포인터가 남아있을 시 |
문제점 | 프로그램 충돌 (Segmentation Fault) 예기치 않은 동작 보안 취약점 발생 가능 |
발생 원인 | 초기화되지 않은 포인터 사용 메모리 해제 후 포인터 재사용 잘못된 메모리 주소 접근 |
해결 방법 | 포인터 사용 전 반드시 초기화 메모리 해제 후 포인터에 NULL 대입 포인터 유효성 검사 옵션형 사용 고려 |
관련 개념 | 포인터 메모리 관리 세그멘테이션 오류 |
주의 사항 | 널 포인터 역참조는 프로그램 오류의 주요 원인이므로 주의해야 함 |
프로그래밍 언어별 특징 | |
C/C++ | NULL 또는 0을 사용하여 널 포인터 표현 널 포인터 역참조 시 세그멘테이션 오류 발생 |
Java | null을 사용하여 널 포인터 표현 널 포인터 역참조 시 NullPointerException 발생 |
C# | null을 사용하여 널 포인터 표현 널 포인터 역참조 시 NullReferenceException 발생 |
Python | None을 사용하여 널 포인터 표현 널 포인터 역참조 시 AttributeError 발생 |
2. 역사
널 포인터는 1965년 영국의 컴퓨터 과학자 토니 호어가 ALGOL W 언어를 설계하면서 처음 도입했다.[17][18][33]
2. 1. 토니 호어의 발명
2009년, 토니 호어는 자신이 1965년에 ALGOL W 언어의 일부로 널 참조를 발명했다고 밝혔다.[17][18][33] 그는 2009년 한 컨퍼런스에서 이 발명을 "10억 달러짜리 실수"라고 묘사했다.호어에 따르면, 당시 그는 객체 지향 언어인 ALGOL W에서 참조를 위한 포괄적인 타입 시스템을 설계하고 있었다. 그의 목표는 컴파일러 검사를 통해 모든 참조 사용의 안전성을 절대적으로 보장하는 것이었다. 하지만 그는 "단순히 구현하기가 너무 쉬웠기 때문에" 널 참조를 포함시키려는 유혹을 참지 못했다고 설명했다. 호어는 이 결정이 "지난 40년 동안 수많은 오류, 취약성, 시스템 충돌로 이어졌으며, 아마도 10억 달러의 고통과 피해를 야기했을 것"이라고 덧붙였다.
3. C
C 언어에서 널 포인터는 어떤 유효한 객체나 함수도 가리키지 않는 특별한 포인터 값이다. C 표준은 서로 다른 타입의 널 포인터라도 비교 연산 시에는 항상 같다고 평가되도록 보장한다.[3][19][34] 이는 널 포인터가 특정 메모리 주소(예: 0번지)를 의미하는 것과는 별개로, '아무것도 가리키지 않음'이라는 상태를 나타내는 추상적인 개념이기 때문이다.
널 포인터를 표현하기 위해 전통적으로 `NULL`이라는 매크로가 사용되어 왔으며, 이는 구현 환경에 따라 다르게 정의될 수 있다. C23 표준에서는 타입 안전성을 높인 `nullptr` 키워드를 도입하여 널 포인터를 나타낸다. 자세한 내용은 NULL 매크로 섹션에서 다룬다.
널 포인터가 가리키는 곳에 접근하려는 시도, 즉 역참조는 C 언어에서 정의되지 않은 동작으로 규정된다.[10] 대부분의 경우 이는 세그멘테이션 오류와 같은 심각한 런타임 오류를 발생시켜 프로그램 실행을 중단시키지만, 특정 환경이나 컴파일러 최적화에 따라 예기치 않은 방식으로 동작할 수도 있다. 자세한 내용은 널 포인터 역참조 섹션에서 다룬다.
3. 1. NULL 매크로
C 언어에서는 모든 타입의 두 널 포인터는 서로 비교했을 때 같다고 보장된다.[3][19][34] 전처리기 매크로 `NULL`은 `C89/C90 및 C99 표준에서는 `NULL`을 널 포인터 상수를 나타내는 매크로로 정의했다.[21] 많은 구현에서 이는 정수 상수 `0` 또는 `0`을 범용 포인터 타입인 `void*`로 형 변환한 `((void *)0)`으로 정의된다.[5][21][36] C 언어에서 `void*` 타입은 다른 모든 포인터 타입으로 암시적으로 변환될 수 있으므로, 포인터 타입 변수에 `NULL`을 대입할 때 별도의 타입 캐스팅은 필요하지 않다. POSIX.1-2008 표준에서는 `NULL`을 `(void *) 0`으로 정의하며, 정수 `0`이 아니어야 함을 명시하고 있다.[23] 따라서 대부분의 표준 C 라이브러리는 `NULL`을 `(void *) 0`으로 정의한다.
C23 표준부터는 새로운 키워드 `nullptr`가 도입되어 널 포인터를 나타내는 타입 안전한 상수로 사용된다. `nullptr`의 타입은 `nullptr_t`이다.[6] C23에서도 매크로 `NULL`은 여전히 구현 정의 널 포인터 상수로 정의되지만[22], 일부 구현에서는 `NULL`이 `nullptr`로 확장(전개)될 수도 있다.[21]
C 표준은 널 포인터가 반드시 메모리 주소 0을 가리키는 포인터와 같다고 명시하지는 않는다.[10] 정수 0을 포인터로 캐스팅하면 널 포인터가 되는 것은 보장되지만, 널 포인터를 정수로 캐스팅했을 때 반드시 0이 된다는 보장은 없다.[24] 역사적으로 널 포인터를 0 이외의 값으로 표현하는 구현도 존재했다.[25][26]
3. 2. 널 포인터 역참조
C 언어에서 널 포인터를 역참조하는 것은 정의되지 않은 동작(Undefined Behavior)이다.[10][38] 이는 일반적으로 프로그램이 접근해서는 안 되는 메모리 영역(예: 매핑되지 않은 메모리)에 읽거나 쓰려고 시도하는 결과를 낳는다. 많은 시스템에서 이러한 시도는 세그멘테이션 오류(Segmentation Fault)나 접근 위반(Access Violation)과 같은 오류를 발생시켜 프로그램을 강제로 중단시킨다.[7] 이는 널 포인터가 일반적으로 시스템에서 실제 객체를 저장하기 위해 할당되지 않는 특별한 값(종종 메모리 주소 0)으로 표현되기 때문이다.[10]하지만 널 포인터를 역참조했을 때 항상 프로그램이 중단되는 것은 아니다.[10][38] 특정 환경에서는 다른 동작이 나타날 수 있다. 예를 들어, 구형 x86 프로세서의 리얼 모드에서는 메모리 주소 `0000:0000`에 대한 접근이 가능할 수 있다. 이런 환경에서 만약 널 포인터가 이 주소를 가리킨다면, 역참조는 기술적으로는 성공하지만 프로그래머가 예상하지 못한 결과를 낳거나 데이터를 손상시킬 수 있다(정의되지 않았지만 충돌하지 않는 동작).[7] 또한, 매우 특수한 경우, 예를 들어 16비트 리얼 모드 x86 환경에서 동작하는 BIOS 코드는 의도적으로 물리 주소 0에 위치한 인터럽트 설명자 테이블(IDT) 같은 시스템 구조에 접근하기 위해 널 포인터(또는 그와 같은 값의 포인터)를 역참조하기도 한다.[7]
컴파일러 최적화 과정에서 널 포인터 역참조와 관련된 예기치 않은 동작이 발생할 수도 있다. 컴파일러는 C 표준에 따라 정의되지 않은 동작이 코드에 없다고 가정하고 최적화를 수행할 수 있다.[10] 이 과정에서 널 포인터 역참조 검사를 생략하거나 코드의 실행 흐름을 변경하여, 원래라면 발생했을 세그멘테이션 오류 대신 다른 종류의 오류나 오작동을 일으킬 수 있다.[7]
4. C++
C++에서는 C로부터 NULL 매크로를 상속받았지만, 전통적으로 정수 리터럴 0을 널 포인터 상수로 사용하는 것을 더 선호했다.[37][8] 이는 C++의 형식 검사가 C보다 엄격하여, 범용 포인터인 void\*를 다른 포인터 형식으로 암묵적으로 변환할 수 없기 때문이다.[27] C로부터의 이식성을 위해 NULL 매크로는 표준 헤더에 여전히 정의되어 있으며, 구현에 따라 정의된 널 포인터 상수로 확장된다.[28] 하지만 C처럼 `#define NULL ((void*)0)` 로 정의하면 void\* 외의 포인터에 대입할 때 명시적 형 변환이 필요해지므로, C++에서는 NULL을 정수 리터럴 0으로 정의하는 경우가 많았다. C와 공유되는 헤더에서는 보통 __cplusplus 정의 여부에 따라 NULL의 정의가 달라지도록 구현된다.
그러나 정수 리터럴 0을 널 포인터로 사용하는 방식은 함수 오버로드나 템플릿과 관련하여 모호성을 유발하는 등 문제를 일으킬 수 있었다. 이러한 문제를 해결하기 위해 C++11 표준에서는 타입 안전성을 높이고 널 포인터임을 명확하게 나타내는 명시적인 널 포인터 리터럴인 nullptr와 그 타입인 std::nullptr_t를 도입했다.[29] C++11 이후에도 NULL 매크로는 계속 사용할 수 있지만, 구현에 따라 정수 리터럴 0 또는 nullptr로 정의될 수 있다.[30]
4. 1. nullptr
C++에서는 C 언어로부터 'NULL' 매크로를 물려받았지만, 정수 리터럴 '0'을 널 포인터 상수로 사용하는 경우가 더 일반적이었다.[37][8] 이는 C++의 더 엄격한 형식 검사 때문인데, C와 달리 범용 포인터인 'void*'를 다른 타입의 포인터로 암묵적으로 변환할 수 없기 때문이다.[27] 만약 'NULL'을 C처럼 '((void*)0)'으로 정의하면, 'void*'가 아닌 포인터에 'NULL'을 대입할 때마다 명시적인 형 변환이 필요해지는 불편함이 생긴다. 이 때문에 많은 C++ 구현에서는 'NULL' 매크로를 단순히 정수 리터럴 '0'으로 정의했다.[28]하지만 정수 리터럴 '0'을 널 포인터로 사용하는 방식은 함수 오버로드나 템플릿을 사용할 때 문제를 일으킬 수 있었다. 예를 들어, 정수 인자를 받는 함수와 포인터 인자를 받는 함수가 오버로딩되어 있을 때, '0'을 전달하면 컴파일러는 이를 정수 '0'으로 해석할지, 널 포인터로 해석할지 모호해질 수 있다.
이러한 문제를 해결하기 위해 C++11 표준에서는 새로운 키워드인 'nullptr'와 그 타입인 'nullptr_t'를 도입했다.[29][8] 'nullptr'는 어떤 정수 타입으로도 암묵적으로 변환되지 않고, 오직 포인터 타입으로만 변환될 수 있는 특별한 리터럴이다. 이를 통해 널 포인터를 명확하고 타입 안전하게 표현할 수 있게 되었다. C++11 이후에도 'NULL' 매크로는 여전히 사용할 수 있지만, 구현에 따라 '0'으로 정의될 수도 있고, 'nullptr'로 정의될 수도 있다.[30]
'nullptr'와 'nullptr_t'는 이후 C23 표준에서 C 언어에도 도입되었다.[8]
4. 2. 널 포인터 역참조
널 포인터는 유효한 객체를 가리키지 않으므로, 이를 역참조하려는 시도는 일반적으로 런타임 오류나 프로그램의 즉각적인 충돌을 일으킨다. 하지만 항상 그런 것은 아니다.- C에서 널 포인터를 역참조하는 행위는 정의되지 않은 동작(undefined behavior)이다.[38] 많은 시스템 구현에서는 널 포인터가 실제 객체 저장을 위해 할당되지 않는 메모리 주소(예: 주소 0)를 나타내도록 선택한다. 따라서 널 포인터를 역참조하는 코드는 세그멘테이션 오류를 발생시키며 프로그램 실행이 중단되는 경우가 많다. 그러나 이것이 반드시 보장되는 동작은 아니다.
- C++에서 널 포인터를 역참조하는 것 역시 C와 마찬가지로 정의되지 않은 동작이다. C++ 표준은 널 포인터 상수로 정수 리터럴 0을 사용하는 것을 허용했으며[27], C++11부터는 명시적인 널 포인터 리터럴인 `nullptr`를 도입했다.[29] C에서처럼 역참조 시 예상치 못한 결과를 초래하거나 프로그램이 비정상적으로 종료될 수 있다.
- Java에서는 널 참조에 접근하면 `NullPointerException` (NPE) 예외가 발생한다. 이 예외는 프로그램 코드 내에서 잡아 처리할 수 있지만, 일반적으로는 이런 예외 자체가 발생하지 않도록 코드를 작성하는 것이 권장된다.
- .NET 환경에서는 널 참조에 접근하면 `NullReferenceException` 예외가 발생한다. Java와 마찬가지로 이 예외를 프로그램에서 잡아 처리할 수 있지만, 좋은 프로그래밍 습관으로 여겨지지는 않는다.
- Objective-C에서는 널 포인터(
nil
객체)에 메시지를 보내도 프로그램이 중단되지 않는다. 해당 메시지는 단순히 무시되며, 반환 값이 필요한 경우 메시지의 반환 타입에 따라nil
(객체 타입) 또는0
(기본 데이터 타입) 등이 반환된다.[39]
5. 다른 프로그래밍 언어
프로그래밍 언어마다 널 포인터에 해당하는 개념을 다르게 구현하고 지칭한다. 예를 들어, 태그 아키텍처를 가진 언어에서는 널 포인터가 될 수 있는 포인터를, 예외적인 경우를 명시적으로 처리하도록 강제하는 태그 유니온으로 대체하기도 한다. 이러한 포인터는 계산된 태그가 있는 태그 포인터로 볼 수도 있다. 각 언어는 널 상태를 나타내기 위해 `null`, `nil`, `None` 등 다양한 리터럴을 사용하며, 그 의미와 동작 방식도 언어마다 차이가 있다.
5. 1. Java
Java에서는 널 참조('null')에 접근하면 https://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html NullPointerException (NPE)이라는 예외가 발생한다. 이 예외는 프로그램의 오류 처리 코드를 통해 잡아서(catch) 처리할 수 있지만, 애초에 이러한 예외가 발생하지 않도록 코드를 작성하는 것이 더 권장되는 방식이다.5. 2. C#
.NET 및 C#에서는 널 참조(null
)에 접근하면 NullReferenceException
예외가 발생한다. 이 예외는 프로그램 코드에서 잡아서 처리할 수 있지만, 일반적으로 예외를 잡는 것은 좋은 프로그래밍 습관으로 여겨지지 않는다.5. 3. Objective-C
Objective-C에서는 프로그램이 중단되지 않고 nil 객체(널 포인터)에 메시지를 보낼 수 있다. 메시지는 단순히 무시되며, 반환 값(있는 경우)은 유형에 따라 nil 또는 0이다.[11]5. 4. 기타 언어
프로그래밍 언어마다 ''널 포인터''를 나타내는 리터럴은 다양하다.일부 Lisp 구현에서는 널 포인터로 사용되는 값(
nil
)이 실제로는 구현에 유용한 내부 데이터 블록에 대한 포인터일 수 있다. 이는 사용자 프로그램에서 명시적으로 접근할 수는 없지만, 구현 내부에서는 유용한 상수와 빠른 접근 방법으로 사용될 수 있다.다른 여러 언어에서도 용어나 키워드는 다르지만, 널 포인터와 유사한 개념이 존재한다. 각 언어에서 사용하는 널 포인터 또는 그에 상응하는 키워드는 다음과 같다.
언어 | 널 포인터/참조 키워드 |
---|---|
파스칼 | nil [31][32] |
스위프트 | nil |
에펠 | void 참조 |
파이썬 | None |
자바 | null |
C# | null |
C++/CLI | nullptr |
C++11 | nullptr |
Visual Basic | Nothing |
Visual Basic .NET | Nothing |
Objective-C | nil |
루비 | nil |
REALbasic | Nil |
포인터가 아닌 참조를 이용하는 언어의 경우, 개념상 널 포인터에 해당하는 것은 널 참조 (null reference|널 레퍼런스영어)라고 불린다.
6. 널 포인터 역참조 완화
널 포인터는 유효한 객체를 가리키지 않으므로, 이를 역참조(해당 메모리 위치의 데이터에 접근)하려는 시도는 대개 런타임 오류나 프로그램의 즉각적인 충돌을 유발한다. 미국의 비영리 연구 개발 기관인 MITRE는 널 포인터 오류를 가장 흔하게 악용되는 소프트웨어 취약점 중 하나로 지목했다.[9]
각 프로그래밍 언어는 널 포인터 역참조를 다르게 처리한다.
- C 언어에서는 널 포인터를 역참조하는 행위는 정의되지 않은 동작이다.[10] 많은 구현 환경에서 이는 접근 위반을 일으켜 프로그램 실행을 중단시킨다. 이는 널 포인터 값이 시스템에서 객체 저장용으로 할당되지 않는 주소로 선택되기 때문이다. 그러나 컴파일러 최적화 과정에서 정의되지 않은 동작이 없다고 가정할 수 있으므로, 이러한 동작이 항상 보장되는 것은 아니다.
- 델파이 및 다른 파스칼 구현체에서는 상수 'nil'이 메모리의 첫 번째 주소를 가리키는 널 포인터로 사용된다. 이를 역참조하면 운영체제 수준의 예외가 발생하며, 'System.SysUtils' 유닛이 사용된 경우 파스칼의 'EAccessViolation' 예외로 처리된다.
- 자바에서는 널 참조('null')에 접근하면 NullPointerException이 발생한다. 이 예외는 프로그램 코드에서 잡아서 처리할 수 있지만, 애초에 이런 예외가 발생하지 않도록 코드를 작성하는 것이 권장된다.
- 리스프에서 'nil'은 일급 객체이다. 관례적으로 '(first nil)'과 '(rest nil)' 연산의 결과는 모두 'nil'이다. 따라서 'nil'을 역참조해도 직접적인 오류는 발생하지 않지만, 잘못 작성된 코드는 무한 루프에 빠질 위험이 있다.
- .NET 환경과 C#에서는 널 참조('null')에 접근하면 'NullReferenceException'이 발생한다. 이 예외를 잡아서 처리하는 것은 일반적으로 권장되지 않지만, 필요하다면 프로그램 내에서 처리할 수 있다.
- Objective-C에서는 'nil' 객체(널 포인터)에 메시지를 보내도 프로그램이 중단되지 않는다. 메시지는 단순히 무시되며, 반환 값이 있다면 자료형에 따라 'nil' 또는 '0'이 반환된다.[11]
과거에는 커널 메모리 보호 기능(SMAP)이 도입되기 전에 널 포인터 역참조 버그가 보안 공격에 악용되기도 했다. 공격자는 운영체제의 페이지 제로를 자신의 주소 공간에 매핑하여 널 포인터가 이 영역을 가리키도록 조작할 수 있었고, 이를 통해 임의 코드 실행까지 가능하게 하는 경우가 있었다.[12]
6. 1. 무효 안전성
런타임 환경에서 널 포인터 역참조로 인해 프로그램이 예기치 않게 중단되는 것을 방지하기 위한 여러 기술이 존재한다.[13] 이러한 기술은 크게 세 가지 접근 방식으로 나눌 수 있다.1. 애초에 널(null) 개념이 없는 언어를 사용한다. 순수 함수형 프로그래밍 언어 등이 여기에 해당될 수 있다. 인터프리터 또는 가상 머신 언어로 실행되는 사용자 코드는 일반적으로 널 포인터 역참조 문제를 겪지 않는다.
2. 코드를 정적 분석하여 런타임에 널 역참조가 발생할 가능성을 사전에 차단한다.
3. 런타임에 널 역참조 오류가 발생했을 때, 디버깅을 용이하게 하는 도구를 제공한다.
무효 안전성(Null safety)은 주로 두 번째 접근 방식에 해당한다. 이는 언어 차원에서 컴파일 시간 검사나 정적 분석 기능을 제공하여, 프로그램 실행 전에 널 포인터 관련 오류를 미리 감지하고 방지하는 것을 목표로 한다. 이를 통해 프로그램의 안정성을 높일 수 있다.
에펠 프로그래밍 언어는 이러한 무효 안전성 개념을 도입하여 널 역참조 문제를 해결하려는 대표적인 예시다.[14] 또한, D[15]나 Rust[16]와 같은 비교적 최신 언어들은 문법적으로 널 값을 가질 수 있는 타입과 그렇지 않은 타입을 명확히 구분하고, 컴파일러가 이를 엄격하게 검사함으로써 널 관련 오류를 효과적으로 예방한다.
외부 도구를 이용해 코드 분석을 수행할 수도 있지만, 언어 자체에서 컴파일러를 통해 직접 무효 안전성을 지원하는 것에 비하면 언어 명세의 제약 등으로 인해 한계가 있을 수 있다.
만약 이러한 예방 메커니즘에도 불구하고 런타임에 널 참조 오류가 발생한다면, 디버깅 도구의 도움을 받아 문제를 해결해야 한다. 이는 세 번째 접근 방식에 해당한다.
6. 2. 널 포인터 대안
일반적으로 각 구조체나 클래스 유형에 대해, 널 포인터에서 발생하는 정의되지 않은 동작을 대체하기 위해 비즈니스 로직의 일부 상태를 나타내는 객체를 정의할 수 있다. 예를 들어 다음과 같은 상태를 나타내는 객체를 사용할 수 있다.- 미래 (Future): 현재는 사용할 수 없지만 나중에 정의될 필드를 나타낸다.
- 해당 없음 (Not Applicable): 정규화되지 않은 구조체의 필드를 나타낸다.
- 오류 (Error): 필드를 초기화할 수 없음을 나타낸다.
- 시간 초과 (Timeout): 특정 작업(전체 프로그램, 스레드, 요청, 명령 등)의 정상적인 실행이 중단될 수 있음을 나타낸다.
참조
[1]
웹사이트
CWE-476: NULL Pointer Dereference
https://cwe.mitre.or[...]
[2]
웹사이트
Null References: The Billion Dollar Mistake
https://www.infoq.co[...]
2024-09-05
[3]
문서
ISO/IEC 9899
[4]
문서
ISO/IEC 9899
[5]
문서
ISO/IEC 9899
[6]
웹사이트
WR14-N3042: Introduce the nullptr constant
https://open-std.org[...]
2022-07-22
[7]
웹사이트
What Every C Programmer Should Know About Undefined Behavior #1/3
https://blog.llvm.or[...]
2011-05-13
[8]
서적
The C++ Programming Language
Addison–Wesley
2001-03
[9]
웹사이트
CWE-476: NULL Pointer Dereference
https://cwe.mitre.or[...]
[10]
문서
ISO/IEC 9899
[11]
문서
The Objective-C 2.0 Programming Language
[12]
문서
OS X exploitable kernel NULL pointer dereference in AppleGraphicsDeviceControl
https://bugs.chromiu[...]
[13]
서적
Proceedings of the 22nd annual ACM SIGPLAN conference on Object oriented programming systems and applications - OOPSLA '07
[14]
웹사이트
Void-safety: Background, definition, and tools
https://www.eiffel.o[...]
2021-11-24
[15]
웹사이트
SafeD – D Programming Language
http://dlang.org/saf[...]
2014-07-17
[16]
웹사이트
Fearless Security: Memory Safety
https://hacks.mozill[...]
2020-11-04
[17]
웹사이트
Null References: The Billion Dollar Mistake
http://www.infoq.com[...]
InfoQ.com
2009-08-25
[18]
웹사이트
Presentation: "Null References: The Billion Dollar Mistake"
https://qconlondon.c[...]
InfoQ.com
2009-08-25
[19]
문서
ISO/IEC 9899
[20]
문서
ISO/IEC 9899
[21]
문서
NULL - cppreference.com (C)
https://en.cpprefere[...]
[22]
문서
ISO/IEC 9899:2024 (en) — N3220 working draft
https://www.open-std[...]
[23]
문서
stddef.h - standard type definitions - The Open Group Base Specifications Issue 7
http://pubs.opengrou[...]
[24]
문서
Can a conforming C implementation #define NULL to be something wacky - Stack Overflow
http://stackoverflow[...]
[25]
문서
comp.lang.c FAQ list - Question 5.17
http://c-faq.com/nul[...]
[26]
웹사이트
C FAQ 5.17 ヌルポインターに0以外の値を使用するマシンや、異なる型のポインターに異なる内部形式を持つマシンは本当に存在するのか。
http://www.kouno.jp/[...]
2021-04-12
[27]
서적
The C++ Programming Language
Addison–Wesley
2001-03
[28]
문서
ISO/IEC 14882:1998, C.2.2.3 Macro NULL
[29]
문서
nullptr - cpprefjp C++日本語リファレンス
https://cpprefjp.git[...]
[30]
문서
NULL - cppreference.com (C++)
https://en.cpprefere[...]
[31]
문서
word symbol、すなわち予約語
[32]
문서
『PASCAL 原書第4版』§8.1
[33]
웹사이트
Null References: The Billion Dollar Mistake
http://www.infoq.com[...]
InfoQ.com
2016-03-09
[34]
문서
ISO/IEC 9899
[35]
문서
ISO/IEC 9899
[36]
문서
ISO/IEC 9899
https://en.wikipedia[...]
[37]
서적
The C++ Programming Language
Addison–Wesley
2001-03-01
[38]
문서
ISO/IEC 9899
https://en.wikipedia[...]
[39]
간행물
The Objective-C 2.0 Programming Language
http://developer.app[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com